---
id: page
sidebar_position: 5.7
hide_table_of_contents: true
title: 分页对象
description: 使用 dbVisitor ORM 的分页查询能力查询数据库数据。
---

dbVisitor 提供了一个分页查询工具类 `PageObject`, 它实现了 `Page` 接口。并提供了如下一些工具属性/方法。

export const HighAttr = () => (
    <span style={{ backgroundColor: 'rgb(227 153 17)', color: '#fff', borderRadius: '2px', padding: '0.2rem'}}>属性</span>
);


export const HighMethod = () => (
    <span style={{ backgroundColor: 'rgb(17 179 227)', color: '#fff', borderRadius: '2px', padding: '0.2rem'}}>方法</span>
);

| 名称                                               | 描述                                             |
|--------------------------------------------------|------------------------------------------------|
| <HighAttr/> `pageSize`                           | 分页查询的页大小，默认是 `-1` 表示无穷大                        |
| <HighAttr/> `currentPage`                        | 当前页号                                           |
| <HighAttr/> `pageNumberOffset`                   | 页码偏移量（例如：从 `1` 页作为起始页，可以设置为 `1`。否则第一页的页码是 `0`） |
| <HighMethod/> `long getFirstRecordPosition()`    | 获取本页第一个记录的索引位置                                 |
| <HighMethod/> `long getTotalPage()`              | 获取总页数                                          |
| <HighMethod/> `long getTotalCount()`             | 获取记录总数                                         |
| <HighMethod/> `long firstPage()`                 | 移动到第一页                                         |
| <HighMethod/> `void previousPage()`              | 移动到上一页                                         |
| <HighMethod/> `void nextPage()`                  | 移动到下一页                                         |
| <HighMethod/> `void lastPage()`                  | 移动到最后一页                                        |
| <HighMethod/> `Map<String, Object> toPageInfo()` | 获取分页信息                                         |

`toPageInfo` 方法会返回如下一个分页查询 Map。

```js
{
    "enable" : true,    // 是否启用分页
    "pageSize" : 20,    // 页大小
    "totalCount" : 200, // 总记录数
    "totalPage" : 10,   // 页总数
    "currentPage" : 0,  // 当前页码
    "recordPosition" : 0// 第一条记录的起始记录位置
}
```

## 自定义方言

和方言相关的接口一共有 5 个，其中 SqlDialect 是所有其它接口都继承的公共接口。

- SqlDialect 基础接口，负责管理关键词清单、生成表名、列名、排序时列名
- ConditionSqlDialect 负责条件相关的生成，例如：like 语句
- InsertSqlDialect 负责高级 insert 语句生成，例如：[处理冲突策略](../lambda/insert#conflict)
- PageSqlDialect 负责分页语句生成。
- SeqSqlDialect 负责执行序列的语句生成。

:::info[提示]
继承 AbstractDialect 抽象类并实现 PageSqlDialect 接口即可自定义分页方言。
- countSql 生成计算 count 的 SQL 语句
- pageSql 生成分页 SQL 语句
:::

```java title='注册自定义方言'
SqlDialectRegister.registerDialectAlias(JdbcUtils.MYSQL, MyDialect.class);
```
